package com.sheng.leetcode.year2023.month07.day17;

import org.junit.Test;

/**
 * @author liusheng
 * @date 2023/07/17
 * <p>
 * 415. 字符串相加
 * <p>
 * 给定两个字符串形式的非负整数 num1 和num2 ，计算它们的和并同样以字符串形式返回。
 * 你不能使用任何內建的用于处理大整数的库（比如 BigInteger）， 也不能直接将输入的字符串转换为整数形式。
 * <p>
 * 示例 1：
 * 输入：num1 = "11", num2 = "123"
 * 输出："134"
 * <p>
 * 示例 2：
 * 输入：num1 = "456", num2 = "77"
 * 输出："533"
 * <p>
 * 示例 3：
 * 输入：num1 = "0", num2 = "0"
 * 输出："0"
 * <p>
 * 提示：
 * 1 <= num1.length, num2.length <= 10^4
 * num1 和num2 都只包含数字 0-9
 * num1 和num2 都不包含任何前导零
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：<a href="https://leetcode.cn/problems/add-strings">415. 字符串相加</a>
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class LeetCode0415 {

    @Test
    public void test01() {
//        String num1 = "11", num2 = "123";
        String num1 = "456", num2 = "77";
//        String num1 = "0", num2 = "0";
        System.out.println(new Solution().addStrings(num1, num2));
    }
}

class Solution {
    public String addStrings(String num1, String num2) {
        int i1 = num1.length() - 1, i2 = num2.length() - 1, add = 0;
        StringBuilder sb = new StringBuilder();
        // 倒着计算
        while (i1 >= 0 || i2 >= 0 || add != 0) {
            // 获取当前位置上的字符并转化为数字
            int n1 = i1 >= 0 ? num1.charAt(i1) - '0' : 0;
            int n2 = i2 >= 0 ? num2.charAt(i2) - '0' : 0;
            // 将当前数字之和与上一次计算出来的进位进行相加
            int ans = n1 + n2 + add;
            // 添加到结果中
            sb.append(ans % 10);
            // 记录是否进位
            add = ans / 10;
            i1--;
            i2--;
        }
        // 倒叙输出
        return sb.reverse().toString();
    }
}
